//
// Created by dddgzc on 2025/1/26.
//

#ifndef PLAYER_H
#define PLAYER_H
#include "Animation.h"
#include "Bullet.h"
#include "Camera.h"
#include "Particle.h"
#include "Platform.h"
#include "PlayerType.h"

extern std::vector<Platform *> platforms;
extern std::vector<Bullet *> bullets;
extern Atlas* runEffectAtlas;
extern Atlas* jumpEffectAtlas;
extern Atlas* landEffectAtlas;

class Player {
public:
    Player();

    ~Player() = default;

    virtual void onDraw(const Camera &camera);

    virtual void onUpdate(int delta);

    void onInput(const SDL_Event &event);

    void setPlayerID(PlayerID id);

    void setPosition(int x, int y);

    // 移动碰撞检测
    void moveAndCollide(int delta);

    // 起跳
    void onJump();

    // 落地
    void onLand();

    int getHp();

    int getMp();

    void setHp(int hp);

    virtual Vector2 getPosition();

    virtual Vector2 getSize();

    virtual void onAttack(); // 普通攻击
    virtual void onAttackEx(); // 大招

    void makeInvulnerable(); // 设置无敌
protected:
    Vector2 position;
    Vector2 velocity = {0, 0};
    int width = 96;
    int height = 96;
    Animation animationIdleLeft;
    Animation animationIdleRight;
    Animation animationRunLeft;
    Animation animationRunRight;
    Animation animationAttackExLeft;
    Animation animationAttackExRight;
    Animation animationDieLeft;
    Animation animationDieRight;
    Animation *currentAnimation = nullptr;
    PlayerID playerID = PlayerID::PLAYER_1;
    // 移动相关
    bool isLeftKeyDown = false;
    bool isRightKeyDown = false;
    bool isFacingRight = false; // 是否面向右边
    // 物理量相关
    const float run_velocity = 0.55f; // x方向
    const float gravity = 1.6e-3f; // y方向
    const float jump_velocity = -0.85f; // 跳跃速度
    // 技能相关
    int attackCd = 500; // 攻击冷却时间
    bool canAttack = true; // 是否能进行普通攻击
    MyTimer timerAttackCd; // 普通攻击冷却时间
    // 角色能量条和生命值
    int mp = 0; // 能量条
    int hp = 100; // 生命值
    // 技能相关
    bool isAttackingEx = false; // 角色是否在释放特殊攻击的状态中
    // 角色受到攻击时的状态
    bool isInvulnerable = false; // 是否出于无敌状态
    bool isShowingSketchFrame = false; // 当前帧是否显示白色剪影
    MyTimer invulnerableTimer; // 无敌状态定时器
    MyTimer invulnerableBlinkTimer; // 无敌状态闪烁定时器
    // 粒子系统的发射定时器
    std::vector<Particle> particles; // 和玩家相关的粒子集合
    MyTimer timerRunEffectGeneration; // 奔跑粒子发射定时器
    MyTimer timerDieEffectGeneration; // 死亡粒子发射定时器

    // 跳跃粒子动画
    Animation jumpEffectAnimation;
    Vector2 jumpEffectPosition; // 跳跃粒子动画的播放位置
    bool isJumpEffectValid = false;

    // 落地粒子动画
    Animation landEffectAnimation;
    Vector2 landEffectPosition;
    bool isLandEffectValid = false;
    // 受到攻击的方向
    Vector2 lastHartPosition;
};


#endif //PLAYER_H
